package 数据结构.hashtable;

public class HashTabDemo {
    public static void main(String[] args) {
        HashTab hashTab = new HashTab(7);
        Emp sisi = new Emp(0, "sisi");
        Emp tom = new Emp(7, "tom");
        Emp tony = new Emp(14, "tony");
        hashTab.add(sisi);
        hashTab.add(tom);
        hashTab.add(tony);
        hashTab.list();
        hashTab.delete(21);
//        hashTab.delete(7);
//        hashTab.delete(14);
        hashTab.list();

    }
}

//创建hashtable
class HashTab {
    private EmpLinkedList[] empLinkedListArray;
    private int size;

    public HashTab(int size) {
        this.size = size;
        this.empLinkedListArray = new EmpLinkedList[size];
        //重点,分别初始化每一条连表
        for (int i = 0; i < size; i++) {
            empLinkedListArray[i] = new EmpLinkedList();
        }
    }

    public void add(Emp emp) {
        int hashTabNo = hashFun(emp.id);
        empLinkedListArray[hashTabNo].add(emp);
    }

    public void list() {
        for (int i = 0; i < size; i++) {
            empLinkedListArray[i].list(i);
        }
    }

    public void findById(int id) {
        int hashNo = hashFun(id);
        Emp empByid = empLinkedListArray[hashNo].findEmpByid(id);
        if (empByid != null) {
            System.out.println("雇员信息" + empByid.id + empByid.name);
        } else {
            System.out.println("该雇员不存在");
        }
    }

    //删除
    public void delete(int id) {
        int hashNo = hashFun(id);
        empLinkedListArray[hashNo].delete(id);
    }

    public int hashFun(int id) {
        return id % size;
    }
}

class Emp {
    public int id;
    public String name;
    public Emp next;

    public Emp(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

//创建emplinkedlist,表示链表
class EmpLinkedList {
    private Emp head;

    //添加雇员到连表
    //假定,id自增长的,添加顺序在最后,直接将该雇员加到本链表的最后即可
    public void add(Emp emp) {
        //如果是添加第一条雇员
        if (head == null) {
            head = emp;
            return;
        }
        //如果不是第一个雇员,需要一个辅助的指针指向最后
        Emp curEmp = head;
        while (true) {
            if (curEmp.next == null) {//说明到达最后节点直接退出
                break;
            }
            curEmp = curEmp.next;
        }
        curEmp.next = emp;//直接在末端插入
    }

    //遍历连表的雇员信息
    public void list(int no) {
        if (head == null) {
            System.out.println("当前第" + (no + 1) + "条链表为空");
            return;
        }
        System.out.print("当前第" + (no + 1) + "条信息为:");
        Emp temp = head;
        while (temp != null) {
            System.out.printf(" => id=%d name=%s\t", temp.id, temp.name);
//            if (temp.next == null) {//说明到达最后节点直接退出
//                break;
//            }
            temp = temp.next;
        }
        System.out.println();

    }

    //查询方法
    public Emp findEmpByid(int id) {
        if (head == null) {
            System.out.println("链表为空");
            return null;
        }
        Emp curEmp = head;
        while (true) {
            if (curEmp.id == id) {
                break;
            }
            if (curEmp.next == null) {
                curEmp = null;
                break;
            }
            curEmp = curEmp.next;
        }
        return curEmp;
    }

    //删除方法
    public void delete(int id) {
        if (head == null) {
            System.out.println("链表为空");
            return;
        }
        //如果是第头一条信息的情况
        if (head.id == id) {
            head = head.next;
            return;
        }
        //需要一个赋值变量
        Emp preEmp = head;
        while (true) {
            if (preEmp.next.id == id) {
                if (preEmp.next.next == null) {//说明是最后一个前一个元素
                    preEmp.next = null;
                    break;
                }
                preEmp.next = preEmp.next.next;
                break;
            }
            preEmp = preEmp.next;

        }
    }


}